<?php

require_once 'BancoDeDados.php';
require_once 'Objeto.php';

class Localizacao {

    private $cod_localizacao;
    private $guarda;
    private $descricao;
    private $local_especifico;
    private $dia;
    private $mes;
    private $ano;
    private $objeto;

    public function &getCod_localizacao() {
        return $this->cod_localizacao;
    }

    public function setCod_localizacao(&$cod_localizacao) {
        $this->cod_localizacao = &$cod_localizacao;
    }

    public function &getGuarda() {
        return $this->guarda;
    }

    public function setGuarda(&$guarda) {
        $this->guarda = &$guarda;
    }

    public function &getDescricao() {
        return $this->descricao;
    }

    public function setDescricao(&$descricao) {
        $this->descricao = &$descricao;
    }

    public function &getLocal_especifico() {
        return $this->local_especifico;
    }

    public function setLocal_especifico(&$local_especifico) {
        $this->local_especifico = &$local_especifico;
    }

    public function &getDia() {
        return $this->dia;
    }

    public function setDia(&$dia) {
        $this->dia = &$dia;
    }

    public function &getMes() {
        return $this->mes;
    }

    public function setMes(&$mes) {
        $this->mes = &$mes;
    }

    public function &getAno() {
        return $this->ano;
    }

    public function setAno(&$ano) {
        $this->ano = &$ano;
    }

    /**
     *
     * @return Objeto
     */
    public function &getObjeto() {
        return $this->objeto;
    }

    public function setObjeto(Objeto &$objeto) {
        $this->objeto = &$objeto;
    }

    public function cadastrar() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into localizacao (cod_interno, guarda, descricao, local_especifico, dia, mes, ano) values(?,?,?,?,?,?,?)');
        $result = $link->execute($stmt, array($this->objeto->getCod_interno(), $this->guarda, $this->descricao, $this->local_especifico, $this->dia, $this->mes, $this->ano));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $result = $banco->getLink()->query('select cod_localizacao from localizacao where cod_interno = ?', array($this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Localização inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Localização com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $this->setCod_localizacao($row['cod_localizacao']);
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'guarda' && $this->guarda != $campo_valor) {
            $this->guarda = &$campo_valor;
        } else if ($campo_id == 'descricao' && $this->descricao != $campo_valor) {
            $this->descricao = &$campo_valor;
        } else if ($campo_id == 'local_especifico' && $this->local_especifico != $campo_valor) {
            $this->local_especifico = &$campo_valor;
        } else if ($campo_id == 'dia' && $this->dia != $campo_valor) {
            $this->dia = &$campo_valor;
        } else if ($campo_id == 'mes' && $this->mes != $campo_valor) {
            $this->mes = &$campo_valor;
        } else if ($campo_id == 'ano' && $this->ano != $campo_valor) {
            $this->ano = &$campo_valor;
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update localizacao set ' . $campo_id . ' = ? where cod_localizacao = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_localizacao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from localizacao where cod_localizacao = ?');
        $result = $link->execute($stmt, array($this->cod_localizacao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public static function consultar(&$cod_interno) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from localizacao where cod_interno = ?', array($cod_interno));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Localização inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Localização com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $localizacao = new Localizacao();
        $localizacao->setAno($row['ano']);
        $localizacao->setCod_localizacao($row['cod_localizacao']);
        $localizacao->setDescricao($row['descricao']);
        $localizacao->setDia($row['dia']);
        $localizacao->setGuarda($row['guarda']);
        $localizacao->setLocal_especifico($row['local_especifico']);
        $localizacao->setMes($row['mes']);
        return $localizacao;
    }

    private function &validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_localizacao from localizacao where cod_interno = ?', array($this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() > 0) {
            return false;
        }
        return true;
    }

}
?>